#include<iostream>
#include<cstdlib>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>

void handler(int signo)
{
    std::cout << "get a sig " << signo << "I am: " << getpid() << std::endl;
    while(true)
    {
        pid_t rid = ::waitpid(-1, nullptr, WNOHANG); //非阻塞等待
        if(rid > 0)
        {
            std::cout << "子进程推出了, 回收成功,child id: " << rid << std::endl;
        }
        else if(rid == 0)
        {
            std::cout << "退出的子进程已经被全部回收了" << std::endl;
            break;
        }
        else 
        {
            std::cout << "wait error" << std::endl;
            break;
        }
    }
}

int main()
{
    //1.验证子进程退出,给父进程发送SIGCHLD信号
    //2.我们可不可以基于信号进行子进程回收呢?
    //::signal(SIGCHLD,handler);
    ::signal(SIGCHLD, SIG_IGN);
    //linux下,将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的
    //问题一:1个子进程, 10个呢? //只要有一个进程退出,就循环等待
    //问题二:10个子进程,6个退出呢? //非阻塞等待回收,没有子进程退出时rid==0回收完毕
    for(int i = 0; i < 10; i++)
    {
        if(fork() == 0)
        {
            sleep(5);
            std::cout << "子进程退出" << std::endl;
            exit(0);
        }
    }
    while(true)
    {
        sleep(1);
    }
    return 0;
}